import os
import sys
import subprocess
import shutil
# 寻找商机, 挣取信息差
def check_pyinstaller():
    """检查是否安装了PyInstaller，如果没有则安装"""
    try:
        import PyInstaller
        print("PyInstaller已安装")
        return True
    except ImportError:
        print("PyInstaller未安装，正在安装...")
        try:
            subprocess.check_call([sys.executable, "-m", "pip", "install", "pyinstaller"])
            print("PyInstaller安装成功")
            return True
        except subprocess.CalledProcessError as e:
            print(f"安装PyInstaller失败: {e}")
            return False

def build_executable():
    """构建可执行文件"""
    # 检查PyInstaller是否安装
    if not check_pyinstaller():
        return
    
    # 获取当前脚本所在目录
    current_dir = os.path.dirname(os.path.abspath(__file__))
    
    # 设置要打包的脚本
    script_path = os.path.join(current_dir, "excel_merger.py")
    
    # 检查脚本是否存在
    if not os.path.exists(script_path):
        print(f"错误: 找不到脚本文件 {script_path}")
        return
    
    # 设置输出目录
    dist_dir = os.path.join(current_dir, "dist")
    
    # 如果输出目录已存在，先删除
    if os.path.exists(dist_dir):
        try:
            shutil.rmtree(dist_dir)
            print(f"已删除旧的输出目录: {dist_dir}")
        except Exception as e:
            print(f"删除输出目录失败: {e}")
    
    # 确保配置文件存在
    config_path = os.path.join(current_dir, "config.json")
    if not os.path.exists(config_path):
        # 导入excel_merger模块以创建默认配置文件
        sys.path.append(current_dir)
        try:
            from excel_merger import load_config
            load_config()
            print("已创建默认配置文件")
        except Exception as e:
            print(f"创建默认配置文件失败: {e}")
    
    # 构建命令
    cmd = [
        sys.executable, 
        "-m", 
        "PyInstaller",
        "--onefile",
        "--name", "ExcelMerger",
        "--clean",
        "--exclude-module=tkinter",  # 排除GUI模块
        "--exclude-module=unittest",  # 排除测试模块
        "--exclude-module=pydoc",  # 排除文档模块
        "--upx-dir=D:\\Tools\\UPX",  # 修改为实际的UPX安装路径
        "--noconfirm",  # 不确认覆盖
        script_path
    ]
    
    print("开始构建可执行文件...")
    print(f"命令: {' '.join(cmd)}")
    
    try:
        # 执行PyInstaller命令
        subprocess.check_call(cmd)
        
        # 检查是否成功生成可执行文件
        exe_path = os.path.join(dist_dir, "ExcelMerger.exe")
        if os.path.exists(exe_path):
            # 复制配置文件到输出目录
            try:
                shutil.copy2(config_path, dist_dir)
                print(f"已复制配置文件到: {dist_dir}\\config.json")
            except Exception as e:
                print(f"复制配置文件失败: {e}")
            
            print(f"\n构建成功! 可执行文件位置: {exe_path}")
            print("\n使用方法:")
            print("1. 命令行模式:")
            print("   ExcelMerger.exe --excel 文件1.xlsx 文件2.xlsx --paypal PayPal数据.csv --air 云汇数据.csv --output 输出文件.xlsx")
            print("2. 交互模式:")
            print("   直接双击ExcelMerger.exe，按照提示输入文件路径")
            print("3. 配置文件模式:")
            print("   修改同目录下的config.json文件，然后运行ExcelMerger.exe")
        else:
            print(f"构建失败: 找不到生成的可执行文件 {exe_path}")
    
    except subprocess.CalledProcessError as e:
        print(f"构建失败: {e}")

if __name__ == "__main__":
    build_executable()